from django.shortcuts import render
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.decorators import action
from drfstudy.models import Student, Classes
from drfstudy.serializers import StudentSerializer, ClassesSerializer


# Create your views here.


# 学生视图
# class StudentViewSet(viewsets.ViewSet):
#     # 查看所有学生
#     def list(self, request):
#         # 从模型中获取所有学生
#         students = Student.objects.filter(is_delete=False)  # 过滤一下
#         # 通过序列器化进行序列化 把查询集转换json格式
#         # many=True 查询集 代表多条数据 转json
#         serializer = StudentSerializer(students, many=True)
#         # 响应数据 data属性保存了序列化后的数据 json格式
#         return Response(serializer.data)
#
#     def create(self, request):
#         # 从客户端获取传入的json数据
#         # 创建序列化对象进行反序列化
#         # 检验数据 正确-存储 异常-报错
#
#         # 获取请求数据
#         data = request.data
#         # 创建序列化器对象 转python
#         # instance默认为空 为空create执行创建操作 不为空执行更新操作
#         serializer = StudentSerializer(data=data)
#         # 验证数据 异常-报错
#         serializer.is_valid(raise_exception=True)
#         # 正确-存储
#         serializer.save()
#         # 展示数据
#         return Response(serializer.data, status=status.HTTP_201_CREATED)
#
#     # 查看单个学生
#     def retrieve(self, request, pk):
#         # 查询单个学生 模型对象
#         try:
#             student = Student.objects.filter(is_delete=False).get(id=pk)
#         except Student.DoesNotExist:
#             return Response({'msg': '学生不存在'}, status=status.HTTP_404_NOT_FOUND)
#         # 创建序列化器对象 转python
#         serializer = StudentSerializer(student, many=False)
#         return Response(serializer.data)
#
#     def update(self, request, pk):
#         # 查询单个学生 模型对象
#         try:
#             student = Student.objects.filter(is_delete=False).get(id=pk)
#         except Student.DoesNotExist:
#             return Response({'msg': '学生不存在'}, status=status.HTTP_404_NOT_FOUND)
#         # 从客户端得到的数据反序列化创建序列化器实例 将 JSON 数据转换为模型实例，并进行验证
#         serializer = StudentSerializer(instance=student, data=request.data)  # 更新操作必须传instance参数 指定模型实例
#         # 验证数据
#         serializer.is_valid(raise_exception=True)
#         # 数据保存
#         serializer.save()
#         # 展示数据
#         return Response(serializer.data)
#
#     # 删除学生
#     def destroy(self, request, pk):
#         # 查询单个学生 模型对象
#         try:
#             # 获取模型对象 实例对象
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response({'msg': '学生不存在'}, status=status.HTTP_404_NOT_FOUND)
#         # 逻辑删除 -> 修改操作 自定义一个逻辑删除方法
#         student.delete()
#         # 响应
#         return Response({'msg': '删除成功'}, status=status.HTTP_204_NO_CONTENT)

class StudentViewSet(viewsets.ModelViewSet):
    # 查询集
    # 序列化器 ModelViewSet 封装好了方法
    queryset = Student.objects.filter(is_delete=False)
    # 序列化器
    serializer_class = StudentSerializer


# ModelViewSet定义了拿来用就行  常规的增删改查 单一查询 用viewsets.ModelViewSet即可
class ClassesViewSet(viewsets.ModelViewSet):
    # 定义需要操作的查询集
    queryset = Classes.objects.filter(is_delete=False)
    # 定义序列化器 进行序列化和反序列化
    serializer_class = ClassesSerializer

    # @action 要定义额外的路由和请求方法
    # 要携带id参数 detail=True 代表携带id
    # 查看第一个班级的信息
    # 请求方式 pk 方法名
    # 请求路径 127.0.0.1:8000/drfstudy/classes/first_class/
    @action(methods=['get'], detail=False)
    def first_class(self, request):
        # 获取班级对象
        # first_classes = Classes.objects.filter(is_delete=False).first()
        # self.get_queryset() == Classes.objects.filter(is_delete=False) # 调用父类方法 返回查询集queryset
        first_classes = self.get_queryset().first()
        # 创建序列化器对象
        # serializer = ClassesSerializer(first_classes)
        serializer = self.get_serializer(first_classes)
        # 响应数据
        return Response(serializer.data)

    # 查看指定班级最后一个学生的信息
    # 请求路径 127.0.0.1:8000/drfstudy/classes/pk/last_student/
    @action(methods=['get'], detail=True)
    def last_student(self, request, pk):
        try:
            # 获取班级对象
            # 127.0.0.1:8000/drfstudy/classes/1/last_student/
            classes = self.queryset.get(id=pk)
        except Classes.DoesNotExist:
            return Response({'msg': '班级不存在'}, status=status.HTTP_404_NOT_FOUND)
        # # 获取班级下的所有学生
        # students = classes.student_set.all()
        # # 获取最后一个学生
        # last_student = students.last()
        last_student = classes.student_set.last()
        # 创建序列化器对象
        serializer = self.get_serializer(last_student)
        return Response(serializer.data)
